from package_crawler import *
from readcsv import *
from database import *
from user_crawler import *

if __name__ == '__main__':
    # ------软件包信息---------
    # 获取软件包仓库中包的基本信息（包括包名，简介，仓库是否开放）
    # 参数是要爬取的页数（完整为450页），获取的基本信息存储在本地csv中（持久化存储）
    crawl_package_info(450)
    # 读取csv中的包名，为之后的爬取具体仓库内容做准备
    data = read_package_name()
    # 通过包名爬取openEuler软件包仓库的配置文件信息（主要爬取了 BuildRequires信息和 Requires信息以及包的version和release）
    crawl_package_spec(data)
    # 针对spec进行解析，主要是对字符串进行正则表达式的操作，将依赖项分开，存储到buildreq和req两个csv文件中
    read_spec()

    # -------仓库信息---------
    pkg_list = data
    # 获取仓库信息并存储为json格式（数据量较大，使用json存储）
    for i in range(len(pkg_list)):
        commits = get_repo_commits(pkg_list[i])
        detail = get_repo_detail(pkg_list[i])
        issues = get_repo_issues(pkg_list[i])
        filename1 = 'commits/'+ pkg_list[i] +'_commits'+'.json'
        filename2 = 'detail/'+ pkg_list[i] + '_detail' + '.json'
        filename3 = 'issues/'+ pkg_list[i] + '_issues' + '.json'
        with open(filename1, 'w') as file_obj1:
            json.dump(commits, file_obj1)
        with open(filename2, 'w') as file_obj2:
            json.dump(detail, file_obj2)
        with open(filename3, 'w') as file_obj3:
            json.dump(issues, file_obj3)
        #time.sleep(1)
        print("Saved successfully" + pkg_list[i])

    # -------用户信息---------
    # 获取仓库维护者的emails
    write_email_to_csv( pkg_list)
    # 获取仓库维护者的names
    write_name_to_csv( pkg_list)

    # 通过以上信息获取仓库维护者的user info，并存储为json格式
    names,emails = get_csv()
    for i in range(len(pkg_name)):
        get_user_info(names[i], pkg_list[i],emails[i])

    # -------CVE信息---------
    get_CVE()

    # -------图数据库存储-------
    #引入database，为存储Neo4j做准备
    db = DataBase()
    # 删除图的所有内容
    # db.delete_all()
    # 通过csv文件将包的数据存储在Neo4j图数据库中（Package节点）
    db.add_package()
    # 添加软件包之间的buildrequire依赖关系（构建时依赖）
    db.add_buildrequire()
    # 添加软件包之间的require依赖关系
    db.add_require()
    # 为图数据库添加repo仓库节点
    db.add_repos()
    # 为图数据库添加commit节点
    db.add_commits()
    # 为图数据库添加issue节点
    db.add_issues()
    # 为图数据库添加仓库维护者节点
    db.add_developer()
    # 将包与仓库进行关联
    db.add_rel_repo_pkg()
    # 为图数据库添加漏洞节点
    db.add_vulnerability()


